package com.hedl.practice.diyJava.gather.study_treemap.test;

import com.hedl.practice.diyJava.gather.study_treemap.tmp.Person;
import com.hedl.practice.diyJava.gather.study_treemap.tmp.Student;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

/**
 * SortedMap在遍历时严格按照Key的顺序遍历，最常用的实现类是TreeMap；
 * 作为SortedMap的Key必须实现Comparable接口，或者传入Comparator；
 * 要严格按照compare()规范实现比较逻辑，否则，TreeMap将不能正常工作。
 */
public class Main {
    public static void main(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        map.put("orange",1);
        map.put("apple",2);
        map.put("pear",3);

        for (String s : map.keySet()) {
            Integer integer = map.get(s);
            System.out.println(s+"="+integer);
        }

        System.out.println("=================================================================");
        /**
         * 使用TreeMap时，放入的Key必须实现Comparable接口。
         * String、Integer这些类已经实现了Comparable接口，因此可以直接作为Key使用。
         * 作为Value的对象则没有任何要求。
         * 如果作为Key的class没有实现Comparable接口，那么，必须在创建TreeMap时同时指定一个自定义排序算法：
         */
        Map<Person,Integer> map1 = new TreeMap<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.name.compareTo(o2.name);      //字符串排序
            }
        });
        map1.put(new Person("Tom"), 1);
        map1.put(new Person("Bob"), 2);
        map1.put(new Person("Lily"), 3);

        for (Person person : map1.keySet()) {
            System.out.println(person);
        }

        System.out.println(map1.get(new Person("Bob")));

        System.out.println("=================================================================");
        /**
         * 我们来看一个稍微复杂的例子：这次我们定义了Student类，并用分数score进行排序，高分在前：
         */
        Map<Student,Integer> map2 = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                if (o1.score == o2.score){
                    return 0;
                }
                return o1.score > o2.score ? -1:1;
            }
        });

        map2.put(new Student("Tom", 77), 1);
        map2.put(new Student("Bob", 66), 2);
        map2.put(new Student("Lily", 99), 3);

        for (Student student : map2.keySet()) {
            System.out.println(student);
        }

        /**
         *
         */
        System.out.println(map2.get(new Student("Bob", 66)));
    }
}
